(function($, undefined) {
	function testProps(props) {
		var i;
		for (i in props) {
			if (mod[props[i]] !== undefined) {
				return true
			}
		}
		return false
	}
	function testPrefix() {
		var prefixes = ['Webkit', 'Moz', 'O', 'ms'],
			p;
		for (p in prefixes) {
			if (testProps([prefixes[p] + 'Transform'])) {
				return '-' + prefixes[p].toLowerCase() + '-'
			}
		}
		return ''
	}
	function init(that, options, args) {
		var ret = that;
		if (typeof options === 'object') {
			return that.each(function() {
				if (!this.id) {
					this.id = 'mobiscroll' + (++id)
				}
				if (instances[this.id]) {
					instances[this.id].destroy()
				}
				new $.mobiscroll.classes[options.component || 'Scroller'](this, options)
			})
		}
		if (typeof options === 'string') {
			that.each(function() {
				var r, inst = instances[this.id];
				if (inst && inst[options]) {
					r = inst[options].apply(this, Array.prototype.slice.call(args, 1));
					if (r !== undefined) {
						ret = r;
						return false
					}
				}
			})
		}
		return ret
	}
	var id = +new Date(),
		touches = {},
		instances = {},
		extend = $.extend,
		mod = document.createElement('modernizr').style,
		has3d = testProps(['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective']),
		hasFlex = testProps(['flex', 'msFlex', 'WebkitBoxDirection']),
		prefix = testPrefix(),
		pr = prefix.replace(/^\-/, '').replace(/\-$/, '').replace('moz', 'Moz');
	$.fn.mobiscroll = function(method) {
		extend(this, $.mobiscroll.components);
		return init(this, method, arguments)
	};
	$.mobiscroll = $.mobiscroll || {
		version: '2.13.2',
		util: {
			prefix: prefix,
			jsPrefix: pr,
			has3d: has3d,
			hasFlex: hasFlex,
			testTouch: function(e) {
				if (e.type == 'touchstart') {
					touches[e.target] = true
				} else if (touches[e.target]) {
					delete touches[e.target];
					return false
				}
				return true
			},
			isNumeric: function(a) {
				return a - parseFloat(a) >= 0
			},
			getCoord: function(e, c) {
				var ev = e.originalEvent || e;
				return ev.changedTouches ? ev.changedTouches[0]['page' + c] : e['page' + c]
			},
			constrain: function(val, min, max) {
				return Math.max(min, Math.min(val, max))
			}
		},
		tapped: false,
		presets: {
			scroller: {},
			numpad: {}
		},
		themes: {
			listview: {}
		},
		i18n: {},
		instances: instances,
		classes: {},
		components: {},
		defaults: {
			theme: 'mobiscroll',
			context: 'body'
		},
		userdef: {},
		setDefaults: function(o) {
			extend(this.userdef, o)
		},
		presetShort: function(name, c, p) {
			this.components[name] = function(s) {
				return init(this, extend(s, {
					component: c,
					preset: p === false ? undefined : name
				}), arguments)
			}
		}
	};
	$.scroller = $.scroller || $.mobiscroll;
	$.fn.scroller = $.fn.scroller || $.fn.mobiscroll
})(jQuery);
(function($) {
	$.mobiscroll.i18n.zh = $.extend($.mobiscroll.i18n.zh, {
		setText: '确定',
		cancelText: '取消',
		clearText: '明确',
		selectedText: '选',
		dateFormat: 'yy/mm/dd',
		dateOrder: 'yymmdd',
		dayNames: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
		dayNamesShort: ['日', '一', '二', '三', '四', '五', '六'],
		dayNamesMin: ['日', '一', '二', '三', '四', '五', '六'],
		dayText: '日',
		hourText: '时',
		minuteText: '分',
		monthNames: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
		monthNamesShort: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
		monthText: '月',
		secText: '秒',
		timeFormat: 'HH:ii',
		timeWheels: 'HHii',
		yearText: '年',
		nowText: '当前',
		pmText: '下午',
		amText: '上午',
		dateText: '日',
		timeText: '时间',
		calendarText: '日历',
		closeText: '关闭',
		fromText: '开始时间',
		toText: '结束时间',
		wholeText: '合计',
		fractionText: '分数',
		unitText: '单位',
		labels: ['年', '月', '日', '小时', '分钟', '秒', ''],
		labelsShort: ['年', '月', '日', '点', '分', '秒', ''],
		startText: '开始',
		stopText: '停止',
		resetText: '重置',
		lapText: '圈',
		hideText: '隐藏'
	})
})(jQuery);
(function($) {
	$.mobiscroll.themes.android = {
		dateOrder: 'Mddyy',
		mode: 'clickpick',
		height: 50,
		showLabel: false,
		btnStartClass: 'mbsc-ic mbsc-ic-play3',
		btnStopClass: 'mbsc-ic mbsc-ic-pause2',
		btnResetClass: 'mbsc-ic mbsc-ic-stop2',
		btnLapClass: 'mbsc-ic mbsc-ic-loop2'
	}
})(jQuery);
(function($) {
	var themes = $.mobiscroll.themes,
		theme = {
			dateOrder: 'Mddyy',
			rows: 5,
			minWidth: 76,
			height: 36,
			showLabel: false,
			selectedLineHeight: true,
			selectedLineBorder: 2,
			useShortLabels: true,
			icon: {
				filled: 'star3',
				empty: 'star'
			},
			btnPlusClass: 'mbsc-ic mbsc-ic-arrow-down6',
			btnMinusClass: 'mbsc-ic mbsc-ic-arrow-up6',
			onThemeLoad: function(lang, s) {
				if (s.theme) {
					s.theme = s.theme.replace('android-ics', 'android-holo').replace(' light', '-light')
				}
			},
			onMarkupReady: function(markup) {
				markup.addClass('mbsc-android-holo')
			}
		};
	themes['android-holo'] = theme;
	themes['android-holo-light'] = theme;
	themes['android-ics'] = theme;
	themes['android-ics light'] = theme;
	themes['android-holo light'] = theme
})(jQuery);
(function($) {
	$.mobiscroll.themes.ios = {
		display: 'bottom',
		dateOrder: 'MMdyy',
		rows: 5,
		height: 30,
		minWidth: 60,
		headerText: false,
		showLabel: false,
		btnWidth: false,
		selectedLineHeight: true,
		selectedLineBorder: 2,
		useShortLabels: true
	}
})(jQuery);
(function($) {
	$.mobiscroll.themes.ios7 = {
		display: 'bottom',
		dateOrder: 'MMdyy',
		rows: 5,
		height: 75,
		minWidth: 55,
		headerText: false,
		showLabel: false,
		btnWidth: false,
		selectedLineHeight: true,
		selectedLineBorder: 1,
		useShortLabels: true,
		deleteIcon: 'backspace3',
		checkIcon: 'ion-ios7-checkmark-empty',
		btnCalPrevClass: 'mbsc-ic mbsc-ic-arrow-left5',
		btnCalNextClass: 'mbsc-ic mbsc-ic-arrow-right5',
		btnPlusClass: 'mbsc-ic mbsc-ic-arrow-down5',
		btnMinusClass: 'mbsc-ic mbsc-ic-arrow-up5'
	}
})(jQuery);
(function($) {
	var ver = $.mobile && $.mobile.version.match(/1\.4/);
	$.mobiscroll.themes.jqm = {
		jqmBorder: 'a',
		jqmBody: ver ? 'a' : 'c',
		jqmHeader: 'b',
		jqmWheel: 'd',
		jqmLine: 'b',
		jqmClickPick: 'c',
		jqmSet: 'b',
		jqmCancel: 'c',
		disabledClass: 'ui-disabled',
		activeClass: 'ui-btn-active',
		activeTabInnerClass: 'ui-btn-active',
		btnCalPrevClass: '',
		btnCalNextClass: '',
		selectedLineHeight: true,
		selectedLineBorder: 1,
		onThemeLoad: function(lang, s) {
			var cal = s.jqmBody || 'c',
				txt = s.jqmEventText || 'b',
				bubble = s.jqmEventBubble || 'a';
			s.dayClass = 'ui-body-a ui-body-' + cal;
			s.innerDayClass = 'ui-state-default ui-btn ui-btn-up-' + cal;
			s.calendarClass = 'ui-body-a ui-body-' + cal;
			s.weekNrClass = 'ui-body-a ui-body-' + cal;
			s.eventTextClass = 'ui-btn-up-' + txt;
			s.eventBubbleClass = 'ui-body-' + bubble
		},
		onEventBubbleShow: function(evd, evc) {
			$('.dw-cal-event-list', evc).attr('data-role', 'listview');
			evc.page().trigger('create')
		},
		onMarkupInserted: function(elm, inst) {
			var s = inst.settings;
			if (ver) {
				elm.addClass('mbsc-jqm14');
				$('.mbsc-np-btn, .dwwb, .dw-cal-sc-m-cell .dw-i', elm).addClass('ui-btn');
				$('.dwbc span.dwb, .dw-dr', elm).addClass('ui-btn ui-mini ui-corner-all');
				$('.dw-cal-prev .dw-cal-btn-txt', elm).addClass('ui-btn ui-icon-arrow-l ui-btn-icon-notext ui-shadow ui-corner-all');
				$('.dw-cal-next .dw-cal-btn-txt', elm).addClass('ui-btn ui-icon-arrow-r ui-btn-icon-notext ui-shadow ui-corner-all')
			}
			$('.dw', elm).removeClass('dwbg').addClass('ui-selectmenu ui-overlay-shadow ui-corner-all ui-body-' + s.jqmBorder);
			$('.dwbc .dwb', elm).attr('data-role', 'button').attr('data-mini', 'true').attr('data-theme', s.jqmCancel);
			$('.dwb-s .dwb', elm).addClass('ui-btn-' + s.jqmSet).attr('data-theme', s.jqmSet);
			$('.dwwb', elm).attr('data-role', 'button').attr('data-theme', s.jqmClickPick);
			$('.dwv', elm).addClass('ui-header ui-bar-' + s.jqmHeader);
			$('.dwwr', elm).addClass('ui-corner-all ui-body-' + s.jqmBody);
			$('.dwwl', elm).addClass('ui-body-' + s.jqmWheel);
			$('.dwwol', elm).addClass('ui-body-' + s.jqmLine);
			$('.dwl', elm).addClass('ui-body-' + s.jqmBody);
			$('.dw-cal-tabs', elm).attr('data-role', 'navbar');
			$('.dw-cal-prev .dw-cal-btn-txt', elm).attr('data-role', 'button').attr('data-icon', 'arrow-l').attr('data-iconpos', 'notext');
			$('.dw-cal-next .dw-cal-btn-txt', elm).attr('data-role', 'button').attr('data-icon', 'arrow-r').attr('data-iconpos', 'notext');
			$('.dw-cal-events', elm).attr('data-role', 'page');
			$('.dw-dr', elm).attr('data-role', 'button').attr('data-mini', 'true');
			$('.mbsc-np-btn', elm).attr('data-role', 'button').attr('data-corners', 'false');
			elm.trigger('create')
		}
	}
})(jQuery);
(function($) {
	$.mobiscroll.themes['sense-ui'] = {
		btnStartClass: 'mbsc-ic mbsc-ic-play3',
		btnStopClass: 'mbsc-ic mbsc-ic-pause2',
		btnResetClass: 'mbsc-ic mbsc-ic-stop2',
		btnLapClass: 'mbsc-ic mbsc-ic-loop2'
	}
})(jQuery);
(function($) {
	var themes = $.mobiscroll.themes,
		theme = {
			minWidth: 76,
			height: 76,
			accent: 'none',
			dateOrder: 'mmMMddDDyy',
			headerText: false,
			showLabel: false,
			deleteIcon: 'backspace4',
			icon: {
				filled: 'star3',
				empty: 'star'
			},
			btnWidth: false,
			btnStartClass: 'mbsc-ic mbsc-ic-play3',
			btnStopClass: 'mbsc-ic mbsc-ic-pause2',
			btnResetClass: 'mbsc-ic mbsc-ic-stop2',
			btnLapClass: 'mbsc-ic mbsc-ic-loop2',
			btnHideClass: 'mbsc-ic mbsc-ic-close',
			btnCalPrevClass: 'mbsc-ic mbsc-ic-arrow-left2',
			btnCalNextClass: 'mbsc-ic mbsc-ic-arrow-right2',
			btnPlusClass: 'mbsc-ic mbsc-ic-plus',
			btnMinusClass: 'mbsc-ic mbsc-ic-minus',
			onMarkupInserted: function(elm, inst) {
				var click, touch, active;
				elm.addClass('mbsc-wp');
				$('.dw', elm).addClass('mbsc-wp-' + inst.settings.accent);
				$('.dwb-s .dwb', elm).addClass('mbsc-ic mbsc-ic-checkmark');
				$('.dwb-c .dwb', elm).addClass('mbsc-ic mbsc-ic-close');
				$('.dwb-cl .dwb', elm).addClass('mbsc-ic mbsc-ic-close');
				$('.dwb-n .dwb', elm).addClass('mbsc-ic mbsc-ic-loop2');
				$('.dwwl', elm).on('touchstart mousedown DOMMouseScroll mousewheel', function(e) {
					if (e.type === 'mousedown' && touch) {
						return
					}
					touch = e.type === 'touchstart';
					click = true;
					active = $(this).hasClass('wpa');
					$('.dwwl', elm).removeClass('wpa');
					$(this).addClass('wpa')
				}).on('touchmove mousemove', function() {
					click = false
				}).on('touchend mouseup', function(e) {
					if (click && active && $(e.target).closest('.dw-li').hasClass('dw-sel')) {
						$(this).removeClass('wpa')
					}
					if (e.type === 'mouseup') {
						touch = false
					}
					click = false
				})
			},
			onThemeLoad: function(lang, s) {
				if (lang && lang.dateOrder && !s.dateOrder) {
					var ord = lang.dateOrder;
					ord = ord.match(/mm/i) ? ord.replace(/mmMM|mm|MM/, 'mmMM') : ord.replace(/mM|m|M/, 'mM');
					ord = ord.match(/dd/i) ? ord.replace(/ddDD|dd|DD/, 'ddDD') : ord.replace(/dD|d|D/, 'dD');
					s.dateOrder = ord
				}
				if (s.theme) {
					s.theme = s.theme.replace(' light', '-light')
				}
			}
		};
	themes.wp = theme;
	themes['wp-light'] = theme;
	themes['wp light'] = theme
})(jQuery);
(function($, undefined) {
	var ms = $.mobiscroll;
	ms.datetime = {
		defaults: {
			shortYearCutoff: '+10',
			monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
			monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
			dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
			dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
			dayNamesMin: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
			monthText: 'Month',
			amText: 'am',
			pmText: 'pm',
			getYear: function(d) {
				return d.getFullYear()
			},
			getMonth: function(d) {
				return d.getMonth()
			},
			getDay: function(d) {
				return d.getDate()
			},
			getDate: function(y, m, d, h, i, s) {
				return new Date(y, m, d, h || 0, i || 0, s || 0)
			},
			getMaxDayOfMonth: function(y, m) {
				return 32 - new Date(y, m, 32).getDate()
			},
			getWeekNumber: function(d) {
				d = new Date(d);
				d.setHours(0, 0, 0);
				d.setDate(d.getDate() + 4 - (d.getDay() || 7));
				var yearStart = new Date(d.getFullYear(), 0, 1);
				return Math.ceil((((d - yearStart) / 86400000) + 1) / 7)
			}
		},
		formatDate: function(format, date, settings) {
			if (!date) {
				return null
			}
			var s = $.extend({}, ms.datetime.defaults, settings),
				look = function(m) {
					var n = 0;
					while (i + 1 < format.length && format.charAt(i + 1) == m) {
						n++;
						i++
					}
					return n
				},
				f1 = function(m, val, len) {
					var n = '' + val;
					if (look(m)) {
						while (n.length < len) {
							n = '0' + n
						}
					}
					return n
				},
				f2 = function(m, val, s, l) {
					return (look(m) ? l[val] : s[val])
				},
				i, year, output = '',
				literal = false;
			for (i = 0; i < format.length; i++) {
				if (literal) {
					if (format.charAt(i) == "'" && !look("'")) {
						literal = false
					} else {
						output += format.charAt(i)
					}
				} else {
					switch (format.charAt(i)) {
					case 'd':
						output += f1('d', s.getDay(date), 2);
						break;
					case 'D':
						output += f2('D', date.getDay(), s.dayNamesShort, s.dayNames);
						break;
					case 'o':
						output += f1('o', (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3);
						break;
					case 'm':
						output += f1('m', s.getMonth(date) + 1, 2);
						break;
					case 'M':
						output += f2('M', s.getMonth(date), s.monthNamesShort, s.monthNames);
						break;
					case 'y':
						year = s.getYear(date);
						output += (look('y') ? year : (year % 100 < 10 ? '0' : '') + year % 100);
						break;
					case 'h':
						var h = date.getHours();
						output += f1('h', (h > 12 ? (h - 12) : (h === 0 ? 12 : h)), 2);
						break;
					case 'H':
						output += f1('H', date.getHours(), 2);
						break;
					case 'i':
						output += f1('i', date.getMinutes(), 2);
						break;
					case 's':
						output += f1('s', date.getSeconds(), 2);
						break;
					case 'a':
						output += date.getHours() > 11 ? s.pmText : s.amText;
						break;
					case 'A':
						output += date.getHours() > 11 ? s.pmText.toUpperCase() : s.amText.toUpperCase();
						break;
					case "'":
						if (look("'")) {
							output += "'"
						} else {
							literal = true
						}
						break;
					default:
						output += format.charAt(i)
					}
				}
			}
			return output
		},
		parseDate: function(format, value, settings) {
			var s = $.extend({}, ms.datetime.defaults, settings),
				def = s.defaultValue || new Date();
			if (!format || !value) {
				return def
			}
			if (value.getTime) {
				return value
			}
			value = (typeof value == 'object' ? value.toString() : value + '');
			var shortYearCutoff = s.shortYearCutoff,
				year = s.getYear(def),
				month = s.getMonth(def) + 1,
				day = s.getDay(def),
				doy = -1,
				hours = def.getHours(),
				minutes = def.getMinutes(),
				seconds = 0,
				ampm = -1,
				literal = false,
				lookAhead = function(match) {
					var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
					if (matches) {
						iFormat++
					}
					return matches
				},
				getNumber = function(match) {
					lookAhead(match);
					var size = (match == '@' ? 14 : (match == '!' ? 20 : (match == 'y' ? 4 : (match == 'o' ? 3 : 2)))),
						digits = new RegExp('^\\d{1,' + size + '}'),
						num = value.substr(iValue).match(digits);
					if (!num) {
						return 0
					}
					iValue += num[0].length;
					return parseInt(num[0], 10)
				},
				getName = function(match, s, l) {
					var names = (lookAhead(match) ? l : s),
						i;
					for (i = 0; i < names.length; i++) {
						if (value.substr(iValue, names[i].length).toLowerCase() == names[i].toLowerCase()) {
							iValue += names[i].length;
							return i + 1
						}
					}
					return 0
				},
				checkLiteral = function() {
					iValue++
				},
				iValue = 0,
				iFormat;
			for (iFormat = 0; iFormat < format.length; iFormat++) {
				if (literal) {
					if (format.charAt(iFormat) == "'" && !lookAhead("'")) {
						literal = false
					} else {
						checkLiteral()
					}
				} else {
					switch (format.charAt(iFormat)) {
					case 'd':
						day = getNumber('d');
						break;
					case 'D':
						getName('D', s.dayNamesShort, s.dayNames);
						break;
					case 'o':
						doy = getNumber('o');
						break;
					case 'm':
						month = getNumber('m');
						break;
					case 'M':
						month = getName('M', s.monthNamesShort, s.monthNames);
						break;
					case 'y':
						year = getNumber('y');
						break;
					case 'H':
						hours = getNumber('H');
						break;
					case 'h':
						hours = getNumber('h');
						break;
					case 'i':
						minutes = getNumber('i');
						break;
					case 's':
						seconds = getNumber('s');
						break;
					case 'a':
						ampm = getName('a', [s.amText, s.pmText], [s.amText, s.pmText]) - 1;
						break;
					case 'A':
						ampm = getName('A', [s.amText, s.pmText], [s.amText, s.pmText]) - 1;
						break;
					case "'":
						if (lookAhead("'")) {
							checkLiteral()
						} else {
							literal = true
						}
						break;
					default:
						checkLiteral()
					}
				}
			}
			if (year < 100) {
				year += new Date().getFullYear() - new Date().getFullYear() % 100 + (year <= (typeof shortYearCutoff != 'string' ? shortYearCutoff : new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)) ? 0 : -100)
			}
			if (doy > -1) {
				month = 1;
				day = doy;
				do {
					var dim = 32 - new Date(year, month - 1, 32).getDate();
					if (day <= dim) {
						break
					}
					month++;
					day -= dim
				} while (true)
			}
			hours = (ampm == -1) ? hours : ((ampm && hours < 12) ? (hours + 12) : (!ampm && hours == 12 ? 0 : hours));
			var date = s.getDate(year, month - 1, day, hours, minutes, seconds);
			if (s.getYear(date) != year || s.getMonth(date) + 1 != month || s.getDay(date) != day) {
				return def
			}
			return date
		}
	};
	ms.formatDate = ms.datetime.formatDate;
	ms.parseDate = ms.datetime.parseDate
})(jQuery);
(function($, window, document, undefined) {
	var $activeElm, preventShow, extend = $.extend,
		ms = $.mobiscroll,
		instances = ms.instances,
		userdef = ms.userdef,
		util = ms.util,
		pr = util.jsPrefix,
		has3d = util.has3d,
		getCoord = util.getCoord,
		constrain = util.constrain,
		isOldAndroid = /android [1-3]/i.test(navigator.userAgent),
		animEnd = 'webkitAnimationEnd animationend',
		empty = function() {},
		prevdef = function(ev) {
			ev.preventDefault()
		};
	ms.classes.Widget = function(el, settings, inherit) {
		var $ariaDiv, $ctx, $header, $markup, $overlay, $persp, $popup, $wnd, $wrapper, buttons, btn, doAnim, hasButtons, isModal, lang, modalWidth, modalHeight, posEvents, preset, preventPos, s, scrollLock, setReadOnly, theme, wasReadOnly, wndWidth, wndHeight, that = this,
			$elm = $(el),
			elmList = [],
			posDebounce = {};

		function onBtnStart(ev) {
			if (btn) {
				btn.removeClass('dwb-a')
			}
			btn = $(this);
			if (!btn.hasClass('dwb-d') && !btn.hasClass('dwb-nhl')) {
				btn.addClass('dwb-a')
			}
			if (ev.type === 'mousedown') {
				$(document).on('mouseup', onBtnEnd)
			}
		}
		function onBtnEnd(ev) {
			if (btn) {
				btn.removeClass('dwb-a');
				btn = null
			}
			if (ev.type === 'mouseup') {
				$(document).off('mouseup', onBtnEnd)
			}
		}
		function onShow(prevFocus) {
			if (!prevFocus) {
				$popup.focus()
			}
			that.ariaMessage(s.ariaMessage)
		}
		function onHide(prevAnim) {
			var activeEl, value, type, focus = s.focusOnClose;
			$markup.remove();
			if ($activeElm && !prevAnim) {
				setTimeout(function() {
					if (focus === undefined) {
						preventShow = true;
						activeEl = $activeElm[0];
						type = activeEl.type;
						value = activeEl.value;
						try {
							activeEl.type = 'button'
						} catch (ex) {}
						$activeElm.focus();
						activeEl.type = type;
						activeEl.value = value
					} else if (focus) {
						if (instances[$(focus).attr('id')]) {
							ms.tapped = false
						}
						$(focus).focus()
					}
				}, 200)
			}
			that._isVisible = false;
			event('onHide', [])
		}
		function onPosition(ev) {
			clearTimeout(posDebounce[ev.type]);
			posDebounce[ev.type] = setTimeout(function() {
				var isScroll = ev.type == 'scroll';
				if (isScroll && !scrollLock) {
					return
				}
				that.position(!isScroll)
			}, 200)
		}
		function event(name, args) {
			var ret;
			args.push(that);
			$.each([userdef, theme, preset, settings], function(i, v) {
				if (v && v[name]) {
					ret = v[name].apply(el, args)
				}
			});
			return ret
		}
		that.position = function(check) {
			var w, l, t, anchor, aw, ah, ap, at, al, arr, arrw, arrl, dh, scroll, sl, st, totalw = 0,
				minw = 0,
				css = {},
				nw = Math.min($wnd[0].innerWidth || $wnd.innerWidth(), $persp.width()),
				nh = $wnd[0].innerHeight || $wnd.innerHeight();
			if ((wndWidth === nw && wndHeight === nh && check) || preventPos) {
				return
			}
			if (isModal && that._isLiquid && s.display !== 'bubble') {
				$popup.width(nw)
			}
			if (event('onPosition', [$markup, nw, nh]) === false || !isModal) {
				return
			}
			sl = $wnd.scrollLeft();
			st = $wnd.scrollTop();
			anchor = s.anchor === undefined ? $elm : $(s.anchor);
			if (that._isLiquid && s.layout !== 'liquid') {
				if (nw < 400) {
					$markup.addClass('dw-liq')
				} else {
					$markup.removeClass('dw-liq')
				}
			}
			if (/modal|bubble/.test(s.display)) {
				$wrapper.width('');
				$('.mbsc-w-p', $markup).each(function() {
					w = $(this).outerWidth(true);
					totalw += w;
					minw = (w > minw) ? w : minw
				});
				w = totalw > nw ? minw : totalw;
				$wrapper.width(w).css('white-space', totalw > nw ? '' : 'nowrap')
			}
			modalWidth = $popup.outerWidth();
			modalHeight = $popup.outerHeight(true);
			scrollLock = modalHeight <= nh && modalWidth <= nw;
			that.scrollLock = scrollLock;
			if (s.display == 'modal') {
				l = Math.max(0, sl + (nw - modalWidth) / 2);
				t = st + (nh - modalHeight) / 2
			} else if (s.display == 'bubble') {
				scroll = true;
				arr = $('.dw-arrw-i', $markup);
				ap = anchor.offset();
				at = Math.abs($ctx.offset().top - ap.top);
				al = Math.abs($ctx.offset().left - ap.left);
				aw = anchor.outerWidth();
				ah = anchor.outerHeight();
				l = constrain(al - ($popup.outerWidth(true) - aw) / 2, sl + 3, sl + nw - modalWidth - 3);
				t = at - modalHeight;
				if ((t < st) || (at > st + nh)) {
					$popup.removeClass('dw-bubble-top').addClass('dw-bubble-bottom');
					t = at + ah
				} else {
					$popup.removeClass('dw-bubble-bottom').addClass('dw-bubble-top')
				}
				arrw = arr.outerWidth();
				arrl = constrain(al + aw / 2 - (l + (modalWidth - arrw) / 2), 0, arrw);
				$('.dw-arr', $markup).css({
					left: arrl
				})
			} else {
				l = sl;
				if (s.display == 'top') {
					t = st
				} else if (s.display == 'bottom') {
					t = st + nh - modalHeight
				}
			}
			t = t < 0 ? 0 : t;
			css.top = t;
			css.left = l;
			$popup.css(css);
			$persp.height(0);
			dh = Math.max(t + modalHeight, s.context == 'body' ? $(document).height() : $ctx[0].scrollHeight);
			$persp.css({
				height: dh
			});
			if (scroll && ((t + modalHeight > st + nh) || (at > st + nh))) {
				preventPos = true;
				setTimeout(function() {
					preventPos = false
				}, 300);
				$wnd.scrollTop(Math.min(t + modalHeight - nh, dh - nh))
			}
			wndWidth = nw;
			wndHeight = nh
		};
		that.attachShow = function($elm, beforeShow) {
			elmList.push($elm);
			if (s.display !== 'inline') {
				$elm.on('mousedown.dw', function(ev) {
					if (setReadOnly) {
						ev.preventDefault()
					}
				}).on((s.showOnFocus ? 'focus.dw' : '') + (s.showOnTap ? ' click.dw' : ''), function(ev) {
					if ((ev.type !== 'focus' || (ev.type === 'focus' && !preventShow)) && !ms.tapped) {
						if (beforeShow) {
							beforeShow()
						}
						if ($(document.activeElement).is('input,textarea')) {
							$(document.activeElement).blur()
						}
						$activeElm = $elm;
						that.show()
					}
					setTimeout(function() {
						preventShow = false
					}, 300)
				})
			}
		};
		that.select = function() {
			if (!isModal || that.hide(false, 'set') !== false) {
				that._fillValue();
				event('onSelect', [that.val])
			}
		};
		that.cancel = function() {
			if (!isModal || that.hide(false, 'cancel') !== false) {
				event('onCancel', [that.val])
			}
		};
		that.clear = function() {
			event('onClear', [$markup]);
			if (isModal && !that.live) {
				that.hide(false, 'clear')
			}
			that.setValue(null, true)
		};
		that.enable = function() {
			s.disabled = false;
			if (that._isInput) {
				$elm.prop('disabled', false)
			}
		};
		that.disable = function() {
			s.disabled = true;
			if (that._isInput) {
				$elm.prop('disabled', true)
			}
		};
		that.show = function(prevAnim, prevFocus) {
			var html;
			if (s.disabled || that._isVisible) {
				return
			}
			if (doAnim !== false) {
				if (s.display == 'top') {
					doAnim = 'slidedown'
				}
				if (s.display == 'bottom') {
					doAnim = 'slideup'
				}
			}
			that._readValue();
			event('onBeforeShow', []);
			html = '<div lang="' + s.lang + '" class="mbsc-' + s.theme + ' dw-' + s.display + ' ' + (s.cssClass || '') + (that._isLiquid ? ' dw-liq' : '') + (isOldAndroid ? ' mbsc-old' : '') + (hasButtons ? '' : ' dw-nobtn') + '">' + '<div class="dw-persp">' + (isModal ? '<div class="dwo"></div>' : '') + '<div' + (isModal ? ' role="dialog" tabindex="-1"' : '') + ' class="dw' + (s.rtl ? ' dw-rtl' : ' dw-ltr') + '">' + (s.display === 'bubble' ? '<div class="dw-arrw"><div class="dw-arrw-i"><div class="dw-arr"></div></div></div>' : '') + '<div class="dwwr">' + '<div aria-live="assertive" class="dw-aria dw-hidden"></div>' + (s.headerText ? '<div class="dwv">' + s.headerText + '</div>' : '') + '<div class="dwcc">';
			html += that._generateContent();
			html += '</div>';
			if (hasButtons) {
				html += '<div class="dwbc">';
				$.each(buttons, function(i, b) {
					b = (typeof b === 'string') ? that.buttons[b] : b;
					html += '<span' + (s.btnWidth ? ' style="width:' + (100 / buttons.length) + '%"' : '') + ' class="dwbw ' + b.css + '"><span tabindex="0" role="button" class="dwb dwb' + i + ' dwb-e">' + b.text + '</span></span>'
				});
				html += '</div>'
			}
			html += '</div></div></div></div>';
			$markup = $(html);
			$persp = $('.dw-persp', $markup);
			$overlay = $('.dwo', $markup);
			$wrapper = $('.dwwr', $markup);
			$header = $('.dwv', $markup);
			$popup = $('.dw', $markup);
			$ariaDiv = $('.dw-aria', $markup);
			that._markup = $markup;
			that._header = $header;
			that._isVisible = true;
			posEvents = 'orientationchange resize';
			that._markupReady();
			event('onMarkupReady', [$markup]);
			if (isModal) {
				$(window).on('keydown.dw', function(ev) {
					if (ev.keyCode == 13) {
						that.select()
					} else if (ev.keyCode == 27) {
						that.cancel()
					}
				});
				if (s.scrollLock) {
					$markup.on('touchstart touchmove', function(ev) {
						if (scrollLock) {
							ev.preventDefault()
						}
					})
				}
				if (pr !== 'Moz') {
					$('input,select,button', $ctx).each(function() {
						if (!this.disabled) {
							$(this).addClass('dwtd').prop('disabled', true)
						}
					})
				}
				posEvents += ' scroll';
				ms.activeInstance = that;
				$markup.appendTo($ctx);
				if (has3d && doAnim && !prevAnim) {
					$markup.addClass('dw-in dw-trans').on(animEnd, function() {
						$markup.removeClass('dw-in dw-trans').find('.dw').removeClass('dw-' + doAnim);
						onShow(prevFocus)
					}).find('.dw').addClass('dw-' + doAnim)
				}
			} else if ($elm.is('div')) {
				$elm.html($markup)
			} else {
				$markup.insertAfter($elm)
			}
			event('onMarkupInserted', [$markup]);
			that.position();
			$wnd.on(posEvents, onPosition);
			$markup.on('selectstart mousedown', prevdef).on('click', '.dwb-e', prevdef).on('keydown', '.dwb-e', function(ev) {
				if (ev.keyCode == 32) {
					ev.preventDefault();
					ev.stopPropagation();
					$(this).click()
				}
			});
			setTimeout(function() {
				$.each(buttons, function(i, b) {
					that.tap($('.dwb' + i, $markup), function(ev) {
						b = (typeof b === 'string') ? that.buttons[b] : b;
						b.handler.call(this, ev, that)
					}, true)
				});
				if (s.closeOnOverlay) {
					that.tap($overlay, function() {
						that.cancel()
					})
				}
				if (isModal && !doAnim) {
					onShow(prevFocus)
				}
				$markup.on('touchstart mousedown', '.dwb-e', onBtnStart).on('touchend', '.dwb-e', onBtnEnd);
				that._attachEvents($markup)
			}, 300);
			event('onShow', [$markup, that._valueText])
		};
		that.hide = function(prevAnim, btn, force) {
			if (!that._isVisible || (!force && !that._isValid && btn == 'set') || (!force && event('onClose', [that._valueText, btn]) === false)) {
				return false
			}
			if ($markup) {
				if (pr !== 'Moz') {
					$('.dwtd', $ctx).each(function() {
						$(this).prop('disabled', false).removeClass('dwtd')
					})
				}
				if (has3d && isModal && doAnim && !prevAnim && !$markup.hasClass('dw-trans')) {
					$markup.addClass('dw-out dw-trans').find('.dw').addClass('dw-' + doAnim).on(animEnd, function() {
						onHide(prevAnim)
					})
				} else {
					onHide(prevAnim)
				}
				$wnd.off(posEvents, onPosition)
			}
			delete ms.activeInstance
		};
		that.ariaMessage = function(txt) {
			$ariaDiv.html('');
			setTimeout(function() {
				$ariaDiv.html(txt)
			}, 100)
		};
		that.isVisible = function() {
			return that._isVisible
		};
		that.setValue = empty;
		that._generateContent = empty;
		that._attachEvents = empty;
		that._readValue = empty;
		that._fillValue = empty;
		that._markupReady = empty;
		that._processSettings = empty;
		that.tap = function(el, handler, prevent) {
			var startX, startY, moved;
			if (s.tap) {
				el.on('touchstart.dw', function(ev) {
					if (prevent) {
						ev.preventDefault()
					}
					startX = getCoord(ev, 'X');
					startY = getCoord(ev, 'Y');
					moved = false
				}).on('touchmove.dw', function(ev) {
					if (Math.abs(getCoord(ev, 'X') - startX) > 20 || Math.abs(getCoord(ev, 'Y') - startY) > 20) {
						moved = true
					}
				}).on('touchend.dw', function(ev) {
					var that = this;
					if (!moved) {
						ev.preventDefault();
						setTimeout(function() {
							handler.call(that, ev)
						}, isOldAndroid ? 400 : 10)
					}
					ms.tapped = true;
					setTimeout(function() {
						ms.tapped = false
					}, 500)
				})
			}
			el.on('click.dw', function(ev) {
				if (!ms.tapped) {
					handler.call(this, ev)
				}
				ev.preventDefault()
			})
		};
		that.option = function(opt, value) {
			var obj = {};
			if (typeof opt === 'object') {
				obj = opt
			} else {
				obj[opt] = value
			}
			that.init(obj)
		};
		that.destroy = function() {
			that.hide(true, false, true);
			$.each(elmList, function(i, v) {
				v.off('.dw')
			});
			if (that._isInput && setReadOnly) {
				el.readOnly = wasReadOnly
			}
			event('onDestroy', []);
			delete instances[el.id]
		};
		that.getInst = function() {
			return that
		};
		that.trigger = event;
		that.init = function(ss) {
			that.settings = s = {};
			extend(settings, ss);
			extend(s, ms.defaults, that._defaults, userdef, settings);
			theme = ms.themes[s.theme] || ms.themes.mobiscroll;
			lang = ms.i18n[s.lang];
			event('onThemeLoad', [lang, settings]);
			extend(s, theme, lang, userdef, settings);
			preset = ms.presets[that._class][s.preset];
			s.buttons = s.buttons || (s.display !== 'inline' ? ['set', 'cancel'] : []);
			s.headerText = s.headerText === undefined ? (s.display !== 'inline' ? '{value}' : false) : s.headerText;
			if (preset) {
				preset = preset.call(el, that);
				extend(s, preset, settings)
			}
			if (!ms.themes[s.theme]) {
				s.theme = 'mobiscroll'
			}
			that._isLiquid = (s.layout || (/top|bottom/.test(s.display) ? 'liquid' : '')) === 'liquid';
			that._processSettings();
			$elm.off('.dw');
			doAnim = isOldAndroid ? false : s.animate;
			buttons = s.buttons;
			isModal = s.display !== 'inline';
			setReadOnly = s.showOnFocus || s.showOnTap;
			$wnd = $(s.context == 'body' ? window : s.context);
			$ctx = $(s.context);
			if (!s.setText) {
				buttons.splice($.inArray('set', buttons), 1)
			}
			if (!s.cancelText) {
				buttons.splice($.inArray('cancel', buttons), 1)
			}
			if (s.button3) {
				buttons.splice($.inArray('set', buttons) + 1, 0, {
					text: s.button3Text,
					handler: s.button3
				})
			}
			that.context = $wnd;
			that.live = $.inArray('set', buttons) == -1;
			that.buttons.set = {
				text: s.setText,
				css: 'dwb-s',
				handler: that.select
			};
			that.buttons.cancel = {
				text: (that.live) ? s.closeText : s.cancelText,
				css: 'dwb-c',
				handler: that.cancel
			};
			that.buttons.clear = {
				text: s.clearText,
				css: 'dwb-cl',
				handler: that.clear
			};
			that._isInput = $elm.is('input');
			hasButtons = buttons.length > 0;
			if (that._isVisible) {
				that.hide(true, false, true)
			}
			if (isModal) {
				that._readValue();
				if (that._isInput && setReadOnly) {
					if (wasReadOnly === undefined) {
						wasReadOnly = el.readOnly
					}
					el.readOnly = true
				}
				that.attachShow($elm)
			} else {
				that.show()
			}
			if (that._isInput) {
				$elm.on('change.dw', function() {
					if (!that._preventChange) {
						that.setValue($elm.val(), false)
					}
					that._preventChange = false
				})
			}
		};
		that.val = null;
		that.buttons = {};
		that._isValid = true;
		if (!inherit) {
			instances[el.id] = that;
			that.init(settings)
		}
	};
	ms.classes.Widget.prototype._defaults = {
		lang: 'zh',
		setText: 'Set',
		selectedText: 'Selected',
		closeText: 'Close',
		cancelText: 'Cancel',
		clearText: 'Clear',
		disabled: false,
		closeOnOverlay: true,
		showOnFocus: true,
		showOnTap: true,
		display: 'modal',
		scrollLock: true,
		tap: true,
		btnWidth: true,
		focusOnClose: false
	};
	ms.themes.mobiscroll = {
		rows: 5,
		showLabel: false,
		headerText: false,
		btnWidth: false,
		selectedLineHeight: true,
		selectedLineBorder: 1,
		dateOrder: 'MMddyy',
		weekDays: 'min',
		checkIcon: 'ion-ios7-checkmark-empty',
		btnPlusClass: 'mbsc-ic mbsc-ic-arrow-down5',
		btnMinusClass: 'mbsc-ic mbsc-ic-arrow-up5',
		btnCalPrevClass: 'mbsc-ic mbsc-ic-arrow-left5',
		btnCalNextClass: 'mbsc-ic mbsc-ic-arrow-right5'
	};
	$(window).on('focus', function() {
		if ($activeElm) {
			preventShow = true
		}
	});
	$(document).on('mouseover mouseup mousedown click', function(ev) {
		if (ms.tapped) {
			ev.stopPropagation();
			ev.preventDefault();
			return false
		}
	})
})(jQuery, window, document);
(function($, window, document, undefined) {
	var move, ms = $.mobiscroll,
		classes = ms.classes,
		instances = ms.instances,
		util = ms.util,
		pr = util.jsPrefix,
		has3d = util.has3d,
		hasFlex = util.hasFlex,
		getCoord = util.getCoord,
		constrain = util.constrain,
		testTouch = util.testTouch;

	function convert(w) {
		var ret = {
			values: [],
			keys: []
		};
		$.each(w, function(k, v) {
			ret.keys.push(k);
			ret.values.push(v)
		});
		return ret
	}
	classes.Scroller = function(el, settings, inherit) {
		var $markup, btn, isScrollable, itemHeight, s, trigger, valueText, click, moved, start, startTime, stop, p, min, max, target, index, lines, timer, that = this,
			$elm = $(el),
			iv = {},
			pos = {},
			pixels = {},
			wheels = [];

		function onStart(ev) {
			if (testTouch(ev) && !move && !click && !btn && !isReadOnly(this)) {
				ev.preventDefault();
				ev.stopPropagation();
				move = true;
				isScrollable = s.mode != 'clickpick';
				target = $('.dw-ul', this);
				setGlobals(target);
				moved = iv[index] !== undefined;
				p = moved ? getCurrentPosition(target) : pos[index];
				start = getCoord(ev, 'Y');
				startTime = new Date();
				stop = start;
				scroll(target, index, p, 0.001);
				if (isScrollable) {
					target.closest('.dwwl').addClass('dwa')
				}
				if (ev.type === 'mousedown') {
					$(document).on('mousemove', onMove).on('mouseup', onEnd)
				}
			}
		}
		function onMove(ev) {
			if (move) {
				if (isScrollable) {
					ev.preventDefault();
					ev.stopPropagation();
					stop = getCoord(ev, 'Y');
					if (Math.abs(stop - start) > 3 || moved) {
						scroll(target, index, constrain(p + (start - stop) / itemHeight, min - 1, max + 1));
						moved = true
					}
				}
			}
		}
		function onEnd(ev) {
			if (move) {
				var time = new Date() - startTime,
					val = constrain(p + (start - stop) / itemHeight, min - 1, max + 1),
					speed, dist, tindex, ttop = target.offset().top;
				ev.stopPropagation();
				if (has3d && time < 300) {
					speed = (stop - start) / time;
					dist = (speed * speed) / s.speedUnit;
					if (stop - start < 0) {
						dist = -dist
					}
				} else {
					dist = stop - start
				}
				tindex = Math.round(p - dist / itemHeight);
				if (!moved) {
					var idx = Math.floor((stop - ttop) / itemHeight),
						li = $($('.dw-li', target)[idx]),
						valid = li.hasClass('dw-v'),
						hl = isScrollable;
					if (trigger('onValueTap', [li]) !== false && valid) {
						tindex = idx
					} else {
						hl = true
					}
					if (hl && valid) {
						li.addClass('dw-hl');
						setTimeout(function() {
							li.removeClass('dw-hl')
						}, 100)
					}
				}
				if (isScrollable) {
					calc(target, tindex, 0, true, Math.round(val))
				}
				if (ev.type === 'mouseup') {
					$(document).off('mousemove', onMove).off('mouseup', onEnd)
				}
				move = false
			}
		}
		function onBtnStart(ev) {
			btn = $(this);
			if (btn.hasClass('dwwb')) {
				if (testTouch(ev)) {
					step(ev, btn.closest('.dwwl'), btn.hasClass('dwwbp') ? plus : minus)
				}
			}
			if (ev.type === 'mousedown') {
				$(document).on('mouseup', onBtnEnd)
			}
		}
		function onBtnEnd(ev) {
			btn = null;
			if (click) {
				clearInterval(timer);
				click = false
			}
			if (ev.type === 'mouseup') {
				$(document).off('mouseup', onBtnEnd)
			}
		}
		function onKeyDown(ev) {
			if (ev.keyCode == 38) {
				step(ev, $(this), minus)
			} else if (ev.keyCode == 40) {
				step(ev, $(this), plus)
			}
		}
		function onKeyUp() {
			if (click) {
				clearInterval(timer);
				click = false
			}
		}
		function onScroll(ev) {
			if (!isReadOnly(this)) {
				ev.preventDefault();
				ev = ev.originalEvent || ev;
				var delta = ev.wheelDelta ? (ev.wheelDelta / 120) : (ev.detail ? (-ev.detail / 3) : 0),
					t = $('.dw-ul', this);
				setGlobals(t);
				calc(t, Math.round(pos[index] - delta), delta < 0 ? 1 : 2)
			}
		}
		function step(ev, w, func) {
			ev.stopPropagation();
			ev.preventDefault();
			if (!click && !isReadOnly(w) && !w.hasClass('dwa')) {
				click = true;
				var t = w.find('.dw-ul');
				setGlobals(t);
				clearInterval(timer);
				timer = setInterval(function() {
					func(t)
				}, s.delay);
				func(t)
			}
		}
		function isReadOnly(wh) {
			if ($.isArray(s.readonly)) {
				var i = $('.dwwl', $markup).index(wh);
				return s.readonly[i]
			}
			return s.readonly
		}
		function generateWheelItems(i) {
			var html = '<div class="dw-bf">',
				ww = wheels[i],
				w = ww.values ? ww : convert(ww),
				l = 1,
				labels = w.labels || [],
				values = w.values,
				keys = w.keys || values;
			$.each(values, function(j, v) {
				if (l % 20 === 0) {
					html += '</div><div class="dw-bf">'
				}
				html += '<div role="option" aria-selected="false" class="dw-li dw-v" data-val="' + keys[j] + '"' + (labels[j] ? ' aria-label="' + labels[j] + '"' : '') + ' style="height:' + itemHeight + 'px;line-height:' + itemHeight + 'px;">' + '<div class="dw-i"' + (lines > 1 ? ' style="line-height:' + Math.round(itemHeight / lines) + 'px;font-size:' + Math.round(itemHeight / lines * 0.8) + 'px;"' : '') + '>' + v + '</div></div>';
				l++
			});
			html += '</div>';
			return html
		}
		function setGlobals(t) {
			var multiple = t.closest('.dwwl').hasClass('dwwms');
			min = $('.dw-li', t).index($(multiple ? '.dw-li' : '.dw-v', t).eq(0));
			max = Math.max(min, $('.dw-li', t).index($(multiple ? '.dw-li' : '.dw-v', t).eq(-1)) - (multiple ? s.rows - 1 : 0));
			index = $('.dw-ul', $markup).index(t)
		}
		function formatHeader(v) {
			var t = s.headerText;
			return t ? (typeof t === 'function' ? t.call(el, v) : t.replace(/\{value\}/i, v)) : ''
		}
		function getCurrentPosition(t) {
			var style = window.getComputedStyle ? getComputedStyle(t[0]) : t[0].style,
				matrix, px;
			if (has3d) {
				$.each(['t', 'webkitT', 'MozT', 'OT', 'msT'], function(i, v) {
					if (style[v + 'ransform'] !== undefined) {
						matrix = style[v + 'ransform'];
						return false
					}
				});
				matrix = matrix.split(')')[0].split(', ');
				px = matrix[13] || matrix[5]
			} else {
				px = style.top.replace('px', '')
			}
			return Math.round(-px / itemHeight)
		}
		function ready(t, i) {
			clearTimeout(iv[i]);
			delete iv[i];
			t.closest('.dwwl').removeClass('dwa')
		}
		function scroll(t, index, val, time, active) {
			var px = -val * itemHeight,
				style = t[0].style;
			if (px == pixels[index] && iv[index]) {
				return
			}
			pixels[index] = px;
			style[pr + 'Transition'] = 'all ' + (time ? time.toFixed(3) : 0) + 's ease-out';
			if (has3d) {
				style[pr + 'Transform'] = 'translate3d(0,' + px + 'px,0)'
			} else {
				style.top = px + 'px'
			}
			if (iv[index]) {
				ready(t, index)
			}
			if (time && active) {
				t.closest('.dwwl').addClass('dwa');
				iv[index] = setTimeout(function() {
					ready(t, index)
				}, time * 1000)
			}
			pos[index] = val
		}
		function getValid(val, t, dir, multiple) {
			var cell = $('.dw-li[data-val="' + val + '"]', t),
				cells = $('.dw-li', t),
				v = cells.index(cell),
				l = cells.length;
			if (multiple) {
				setGlobals(t)
			} else if (!cell.hasClass('dw-v')) {
				var cell1 = cell,
					cell2 = cell,
					dist1 = 0,
					dist2 = 0;
				while (v - dist1 >= 0 && !cell1.hasClass('dw-v')) {
					dist1++;
					cell1 = cells.eq(v - dist1)
				}
				while (v + dist2 < l && !cell2.hasClass('dw-v')) {
					dist2++;
					cell2 = cells.eq(v + dist2)
				}
				if (((dist2 < dist1 && dist2 && dir !== 2) || !dist1 || (v - dist1 < 0) || dir == 1) && cell2.hasClass('dw-v')) {
					cell = cell2;
					v = v + dist2
				} else {
					cell = cell1;
					v = v - dist1
				}
			}
			return {
				cell: cell,
				v: multiple ? constrain(v, min, max) : v,
				val: cell.hasClass('dw-v') ? cell.attr('data-val') : null
			}
		}
		function scrollToPos(time, index, manual, dir, active) {
			if (trigger('validate', [$markup, index, time, dir]) !== false) {
				$('.dw-ul', $markup).each(function(i) {
					var t = $(this),
						multiple = t.closest('.dwwl').hasClass('dwwms'),
						sc = i == index || index === undefined,
						res = getValid(that.temp[i], t, dir, multiple),
						cell = res.cell;
					if (!(cell.hasClass('dw-sel')) || sc) {
						that.temp[i] = res.val;
						if (!multiple) {
							$('.dw-sel', t).removeAttr('aria-selected');
							cell.attr('aria-selected', 'true')
						}
						$('.dw-sel', t).removeClass('dw-sel');
						cell.addClass('dw-sel');
						scroll(t, i, res.v, sc ? time : 0.1, sc ? active : false)
					}
				});
				that._valueText = valueText = s.formatResult(that.temp);
				if (that.live) {
					that._hasValue = manual || that._hasValue;
					setValue(manual, manual, 0, true)
				}
				that._header.html(formatHeader(valueText));
				if (manual) {
					trigger('onChange', [valueText])
				}
				trigger('onValidated', [])
			}
		}
		function calc(t, val, dir, anim, orig) {
			val = constrain(val, min, max);
			var cell = $('.dw-li', t).eq(val),
				o = orig === undefined ? val : orig,
				active = orig !== undefined,
				idx = index,
				dist = Math.abs(val - o),
				time = anim ? (val == o ? 0.1 : dist * s.timeUnit * Math.max(0.5, (100 - dist) / 100)) : 0;
			that.temp[idx] = cell.attr('data-val');
			scroll(t, idx, val, time, active);
			setTimeout(function() {
				scrollToPos(time, idx, true, dir, active)
			}, 10)
		}
		function plus(t) {
			var val = pos[index] + 1;
			calc(t, val > max ? min : val, 1, true)
		}
		function minus(t) {
			var val = pos[index] - 1;
			calc(t, val < min ? max : val, 2, true)
		}
		function setValue(fill, change, time, noscroll, temp) {
			if (that._isVisible && !noscroll) {
				scrollToPos(time)
			}
			that._valueText = valueText = s.formatResult(that.temp);
			if (!temp) {
				that.values = that.temp.slice(0);
				that.val = that._hasValue ? valueText : null
			}
			if (fill) {
				trigger('onValueFill', [that._hasValue ? valueText : '', change]);
				if (that._isInput) {
					$elm.val(that._hasValue ? valueText : '');
					if (change) {
						that._preventChange = true;
						$elm.change()
					}
				}
			}
		}
		classes.Widget.call(this, el, settings, true);
		that.setValue = function(values, fill, time, temp, change) {
			that._hasValue = values !== null && values !== undefined;
			that.temp = $.isArray(values) ? values.slice(0) : s.parseValue.call(el, values, that);
			setValue(fill, change === undefined ? fill : change, time, false, temp)
		};
		that.getValue = function() {
			return that._hasValue ? that.values : null
		};
		that.getValues = function() {
			var ret = [],
				i;
			for (i in that._selectedValues) {
				ret.push(that._selectedValues[i])
			}
			return ret
		};
		that.changeWheel = function(idx, time, manual) {
			if ($markup) {
				var i = 0,
					nr = idx.length;
				$.each(s.wheels, function(j, wg) {
					$.each(wg, function(k, w) {
						if ($.inArray(i, idx) > -1) {
							wheels[i] = w;
							$('.dw-ul', $markup).eq(i).html(generateWheelItems(i));
							nr--;
							if (!nr) {
								that.position();
								scrollToPos(time, undefined, manual);
								return false
							}
						}
						i++
					});
					if (!nr) {
						return false
					}
				})
			}
		};
		that.getValidCell = getValid;
		that._generateContent = function() {
			var lbl, html = '',
				l = 0;
			$.each(s.wheels, function(i, wg) {
				html += '<div class="mbsc-w-p dwc' + (s.mode != 'scroller' ? ' dwpm' : ' dwsc') + (s.showLabel ? '' : ' dwhl') + '">' + '<div class="dwwc"' + (s.maxWidth ? '' : ' style="max-width:600px;"') + '>' + (hasFlex ? '' : '<table class="dw-tbl" cellpadding="0" cellspacing="0"><tr>');
				$.each(wg, function(j, w) {
					wheels[l] = w;
					lbl = w.label !== undefined ? w.label : j;
					html += '<' + (hasFlex ? 'div' : 'td') + ' class="dwfl"' + ' style="' + (s.fixedWidth ? ('width:' + (s.fixedWidth[l] || s.fixedWidth) + 'px;') : (s.minWidth ? ('min-width:' + (s.minWidth[l] || s.minWidth) + 'px;') : 'min-width:' + s.width + 'px;') + (s.maxWidth ? ('max-width:' + (s.maxWidth[l] || s.maxWidth) + 'px;') : '')) + '">' + '<div class="dwwl dwwl' + l + (w.multiple ? ' dwwms' : '') + '">' + (s.mode != 'scroller' ? '<div class="dwb-e dwwb dwwbp ' + (s.btnPlusClass || '') + '" style="height:' + itemHeight + 'px;line-height:' + itemHeight + 'px;"><span>+</span></div>' + '<div class="dwb-e dwwb dwwbm ' + (s.btnMinusClass || '') + '" style="height:' + itemHeight + 'px;line-height:' + itemHeight + 'px;"><span>&ndash;</span></div>' : '') + '<div class="dwl">' + lbl + '</div>' + '<div tabindex="0" aria-live="off" aria-label="' + lbl + '" role="listbox" class="dwww">' + '<div class="dww" style="height:' + (s.rows * itemHeight) + 'px;">' + '<div class="dw-ul" style="margin-top:' + (w.multiple ? 0 : s.rows / 2 * itemHeight - itemHeight / 2) + 'px;">';
					html += generateWheelItems(l) + '</div></div><div class="dwwo"></div></div><div class="dwwol"' + (s.selectedLineHeight ? ' style="height:' + itemHeight + 'px;margin-top:-' + (itemHeight / 2 + (s.selectedLineBorder || 0)) + 'px;"' : '') + '></div></div>' + (hasFlex ? '</div>' : '</td>');
					l++
				});
				html += (hasFlex ? '' : '</tr></table>') + '</div></div>'
			});
			return html
		};
		that._attachEvents = function($markup) {
			$markup.on('DOMMouseScroll mousewheel', '.dwwl', onScroll).on('keydown', '.dwwl', onKeyDown).on('keyup', '.dwwl', onKeyUp).on('touchstart mousedown', '.dwwl', onStart).on('touchmove', '.dwwl', onMove).on('touchend', '.dwwl', onEnd).on('touchstart mousedown', '.dwb-e', onBtnStart).on('touchend', '.dwb-e', onBtnEnd)
		};
		that._markupReady = function() {
			$markup = that._markup;
			scrollToPos()
		};
		that._fillValue = function() {
			that._hasValue = true;
			setValue(true, true, 0, true)
		};
		that._readValue = function() {
			var v = $elm.val() || '';
			that._hasValue = v !== '';
			that.temp = that.values ? that.values.slice(0) : s.parseValue(v, that);
			setValue()
		};
		that._processSettings = function() {
			s = that.settings;
			trigger = that.trigger;
			itemHeight = s.height;
			lines = s.multiline;
			that._isLiquid = (s.layout || (/top|bottom/.test(s.display) && s.wheels.length == 1 ? 'liquid' : '')) === 'liquid';
			that.values = null;
			that.temp = null;
			if (lines > 1) {
				s.cssClass = (s.cssClass || '') + ' dw-ml'
			}
		};
		that._selectedValues = {};
		if (!inherit) {
			instances[el.id] = that;
			that.init(settings)
		}
	};
	classes.Scroller.prototype._class = 'scroller';
	classes.Scroller.prototype._defaults = $.extend({}, classes.Widget.prototype._defaults, {
		minWidth: 80,
		height: 40,
		rows: 3,
		multiline: 1,
		delay: 300,
		readonly: false,
		showLabel: true,
		wheels: [],
		mode: 'scroller',
		preset: '',
		speedUnit: 0.0012,
		timeUnit: 0.08,
		formatResult: function(d) {
			return d.join(' ')
		},
		parseValue: function(value, inst) {
			var val = value.split(' '),
				ret = [],
				i = 0,
				keys;
			$.each(inst.settings.wheels, function(j, wg) {
				$.each(wg, function(k, w) {
					w = w.values ? w : convert(w);
					keys = w.keys || w.values;
					if ($.inArray(val[i], keys) !== -1) {
						ret.push(val[i])
					} else {
						ret.push(keys[0])
					}
					i++
				})
			});
			return ret
		}
	})
})(jQuery, window, document);
(function($, undefined) {
	var ms = $.mobiscroll,
		datetime = ms.datetime,
		date = new Date(),
		defaults = {
			startYear: date.getFullYear() - 100,
			endYear: date.getFullYear() + 1,
			showNow: false,
			stepHour: 1,
			stepMinute: 1,
			stepSecond: 1,
			separator: ' ',
			dateFormat: 'mm/dd/yy',
			dateOrder: 'mmddy',
			timeWheels: 'hhiiA',
			timeFormat: 'hh:ii A',
			dayText: 'Day',
			yearText: 'Year',
			hourText: 'Hours',
			minuteText: 'Minutes',
			ampmText: '&nbsp;',
			secText: 'Seconds',
			nowText: 'Now'
		},
		preset = function(inst) {
			var that = $(this),
				html5def = {},
				format;
			if (that.is('input')) {
				switch (that.attr('type')) {
				case 'date':
					format = 'yy-mm-dd';
					break;
				case 'datetime':
					format = 'yy-mm-ddTHH:ii:ssZ';
					break;
				case 'datetime-local':
					format = 'yy-mm-ddTHH:ii:ss';
					break;
				case 'month':
					format = 'yy-mm';
					html5def.dateOrder = 'mmyy';
					break;
				case 'time':
					format = 'HH:ii:ss';
					break
				}
				var min = that.attr('min'),
					max = that.attr('max');
				if (min) {
					html5def.minDate = datetime.parseDate(format, min)
				}
				if (max) {
					html5def.maxDate = datetime.parseDate(format, max)
				}
			}
			var i, k, keys, values, wg, start, end, hasTime, mins, maxs, orig = $.extend({}, inst.settings),
				s = $.extend(inst.settings, ms.datetime.defaults, defaults, html5def, orig),
				offset = 0,
				validValues = [],
				wheels = [],
				ord = [],
				o = {},
				f = {
					y: getYear,
					m: getMonth,
					d: getDay,
					h: getHour,
					i: getMinute,
					s: getSecond,
					a: getAmPm
				},
				invalid = s.invalid,
				valid = s.valid,
				p = s.preset,
				dord = s.dateOrder,
				tord = s.timeWheels,
				regen = dord.match(/D/),
				ampm = tord.match(/a/i),
				hampm = tord.match(/h/),
				hformat = p == 'datetime' ? s.dateFormat + s.separator + s.timeFormat : p == 'time' ? s.timeFormat : s.dateFormat,
				defd = new Date(),
				stepH = s.stepHour,
				stepM = s.stepMinute,
				stepS = s.stepSecond,
				mind = s.minDate || new Date(s.startYear, 0, 1),
				maxd = s.maxDate || new Date(s.endYear, 11, 31, 23, 59, 59),
				minH = mind.getHours() % stepH,
				minM = mind.getMinutes() % stepM,
				minS = mind.getSeconds() % stepS,
				maxH = getMax(stepH, minH, (hampm ? 11 : 23)),
				maxM = getMax(stepM, minM, 59),
				maxS = getMax(stepM, minM, 59);
			format = format || hformat;
			if (p.match(/date/i)) {
				$.each(['y', 'm', 'd'], function(j, v) {
					i = dord.search(new RegExp(v, 'i'));
					if (i > -1) {
						ord.push({
							o: i,
							v: v
						})
					}
				});
				ord.sort(function(a, b) {
					return a.o > b.o ? 1 : -1
				});
				$.each(ord, function(i, v) {
					o[v.v] = i
				});
				wg = [];
				for (k = 0; k < 3; k++) {
					if (k == o.y) {
						offset++;
						values = [];
						keys = [];
						start = s.getYear(mind);
						end = s.getYear(maxd);
						for (i = start; i <= end; i++) {
							keys.push(i);
							values.push((dord.match(/yy/i) ? i : (i + '').substr(2, 2)) + (s.yearSuffix || ''))
						}
						addWheel(wg, keys, values, s.yearText)
					} else if (k == o.m) {
						offset++;
						values = [];
						keys = [];
						for (i = 0; i < 12; i++) {
							var str = dord.replace(/[dy]/gi, '').replace(/mm/, (i < 9 ? '0' + (i + 1) : i + 1) + (s.monthSuffix || '')).replace(/m/, i + 1 + (s.monthSuffix || ''));
							keys.push(i);
							values.push(str.match(/MM/) ? str.replace(/MM/, '<span class="dw-mon">' + s.monthNames[i] + '</span>') : str.replace(/M/, '<span class="dw-mon">' + s.monthNamesShort[i] + '</span>'))
						}
						addWheel(wg, keys, values, s.monthText)
					} else if (k == o.d) {
						offset++;
						values = [];
						keys = [];
						for (i = 1; i < 32; i++) {
							keys.push(i);
							values.push((dord.match(/dd/i) && i < 10 ? '0' + i : i) + (s.daySuffix || ''))
						}
						addWheel(wg, keys, values, s.dayText)
					}
				}
				wheels.push(wg)
			}
			if (p.match(/time/i)) {
				hasTime = true;
				ord = [];
				$.each(['h', 'i', 's', 'a'], function(i, v) {
					i = tord.search(new RegExp(v, 'i'));
					if (i > -1) {
						ord.push({
							o: i,
							v: v
						})
					}
				});
				ord.sort(function(a, b) {
					return a.o > b.o ? 1 : -1
				});
				$.each(ord, function(i, v) {
					o[v.v] = offset + i
				});
				wg = [];
				for (k = offset; k < offset + 4; k++) {
					if (k == o.h) {
						offset++;
						values = [];
						keys = [];
						for (i = minH; i < (hampm ? 12 : 24); i += stepH) {
							keys.push(i);
							values.push(hampm && i === 0 ? 12 : tord.match(/hh/i) && i < 10 ? '0' + i : i)
						}
						addWheel(wg, keys, values, s.hourText)
					} else if (k == o.i) {
						offset++;
						values = [];
						keys = [];
						for (i = minM; i < 60; i += stepM) {
							keys.push(i);
							values.push(tord.match(/ii/) && i < 10 ? '0' + i : i)
						}
						addWheel(wg, keys, values, s.minuteText)
					} else if (k == o.s) {
						offset++;
						values = [];
						keys = [];
						for (i = minS; i < 60; i += stepS) {
							keys.push(i);
							values.push(tord.match(/ss/) && i < 10 ? '0' + i : i)
						}
						addWheel(wg, keys, values, s.secText)
					} else if (k == o.a) {
						offset++;
						var upper = tord.match(/A/);
						addWheel(wg, [0, 1], upper ? [s.amText.toUpperCase(), s.pmText.toUpperCase()] : [s.amText, s.pmText], s.ampmText)
					}
				}
				wheels.push(wg)
			}
			function get(d, i, def) {
				if (o[i] !== undefined) {
					return +d[o[i]]
				}
				if (def !== undefined) {
					return def
				}
				return f[i](defd)
			}
			function addWheel(wg, k, v, lbl) {
				wg.push({
					values: v,
					keys: k,
					label: lbl
				})
			}
			function step(v, st, min, max) {
				return Math.min(max, Math.floor(v / st) * st + min)
			}
			function getYear(d) {
				return s.getYear(d)
			}
			function getMonth(d) {
				return s.getMonth(d)
			}
			function getDay(d) {
				return s.getDay(d)
			}
			function getHour(d) {
				var hour = d.getHours();
				hour = hampm && hour >= 12 ? hour - 12 : hour;
				return step(hour, stepH, minH, maxH)
			}
			function getMinute(d) {
				return step(d.getMinutes(), stepM, minM, maxM)
			}
			function getSecond(d) {
				return step(d.getSeconds(), stepS, minS, maxS)
			}
			function getAmPm(d) {
				return ampm && d.getHours() > 11 ? 1 : 0
			}
			function getDate(d) {
				if (d === null) {
					return d
				}
				var hour = get(d, 'h', 0);
				return s.getDate(get(d, 'y'), get(d, 'm'), get(d, 'd'), get(d, 'a', 0) ? hour + 12 : hour, get(d, 'i', 0), get(d, 's', 0))
			}
			function getMax(step, min, max) {
				return Math.floor((max - min) / step) * step + min
			}
			function getClosestValidDate(d, dir) {
				var next, prev, nextValid = false,
					prevValid = false,
					up = 0,
					down = 0;
				if (isValid(d)) {
					return d
				}
				if (d < mind) {
					d = mind
				}
				if (d > maxd) {
					d = maxd
				}
				next = d;
				prev = d;
				if (dir !== 2) {
					nextValid = isValid(next);
					while (!nextValid && next < maxd) {
						next = new Date(next.getTime() + 1000 * 60 * 60 * 24);
						nextValid = isValid(next);
						up++
					}
				}
				if (dir !== 1) {
					prevValid = isValid(prev);
					while (!prevValid && prev > mind) {
						prev = new Date(prev.getTime() - 1000 * 60 * 60 * 24);
						prevValid = isValid(prev);
						down++
					}
				}
				if (dir === 1 && nextValid) {
					return next
				}
				if (dir === 2 && prevValid) {
					return prev
				}
				return down < up && prevValid ? prev : next
			}
			function isValid(d) {
				if (d < mind) {
					return false
				}
				if (d > maxd) {
					return false
				}
				if (isInObj(d, valid)) {
					return true
				}
				if (isInObj(d, invalid)) {
					return false
				}
				return true
			}
			function isInObj(d, obj) {
				var curr, j, v;
				if (obj) {
					for (j = 0; j < obj.length; j++) {
						curr = obj[j];
						v = curr + '';
						if (!curr.start) {
							if (curr.getTime) {
								if (d.getFullYear() == curr.getFullYear() && d.getMonth() == curr.getMonth() && d.getDate() == curr.getDate()) {
									return true
								}
							} else if (!v.match(/w/i)) {
								v = v.split('/');
								if (v[1]) {
									if ((v[0] - 1) == d.getMonth() && v[1] == d.getDate()) {
										return true
									}
								} else if (v[0] == d.getDate()) {
									return true
								}
							} else {
								v = +v.replace('w', '');
								if (v == d.getDay()) {
									return true
								}
							}
						}
					}
				}
				return false
			}
			function validateDates(obj, y, m, first, maxdays, idx, val) {
				var j, d, v;
				if (obj) {
					for (j = 0; j < obj.length; j++) {
						d = obj[j];
						v = d + '';
						if (!d.start) {
							if (d.getTime) {
								if (s.getYear(d) == y && s.getMonth(d) == m) {
									idx[s.getDay(d) - 1] = val
								}
							} else if (!v.match(/w/i)) {
								v = v.split('/');
								if (v[1]) {
									if (v[0] - 1 == m) {
										idx[v[1] - 1] = val
									}
								} else {
									idx[v[0] - 1] = val
								}
							} else {
								v = +v.replace('w', '');
								for (k = v - first; k < maxdays; k += 7) {
									if (k >= 0) {
										idx[k] = val
									}
								}
							}
						}
					}
				}
			}
			function validateTimes(vobj, i, v, temp, y, m, d, target, valid) {
				var dd, ss, str, parts1, parts2, prop1, prop2, v1, v2, j, i1, i2, add, remove, all, hours1, hours2, hours3, spec = {},
					steps = {
						h: stepH,
						i: stepM,
						s: stepS,
						a: 1
					},
					day = s.getDate(y, m, d),
					w = ['a', 'h', 'i', 's'];
				if (vobj) {
					$.each(vobj, function(i, obj) {
						if (obj.start) {
							obj.apply = false;
							dd = obj.d;
							ss = dd + '';
							str = ss.split('/');
							if (dd && ((dd.getTime && y == s.getYear(dd) && m == s.getMonth(dd) && d == s.getDay(dd)) || (!ss.match(/w/i) && ((str[1] && d == str[1] && m == str[0] - 1) || (!str[1] && d == str[0]))) || (ss.match(/w/i) && day.getDay() == +ss.replace('w', '')))) {
								obj.apply = true;
								spec[day] = true
							}
						}
					});
					$.each(vobj, function(x, obj) {
						add = 0;
						remove = 0;
						i1 = 0;
						i2 = undefined;
						prop1 = true;
						prop2 = true;
						all = false;
						if (obj.start && (obj.apply || (!obj.d && !spec[day]))) {
							parts1 = obj.start.split(':');
							parts2 = obj.end.split(':');
							for (j = 0; j < 3; j++) {
								if (parts1[j] === undefined) {
									parts1[j] = 0
								}
								if (parts2[j] === undefined) {
									parts2[j] = 59
								}
								parts1[j] = +parts1[j];
								parts2[j] = +parts2[j]
							}
							parts1.unshift(parts1[0] > 11 ? 1 : 0);
							parts2.unshift(parts2[0] > 11 ? 1 : 0);
							if (hampm) {
								if (parts1[1] >= 12) {
									parts1[1] = parts1[1] - 12
								}
								if (parts2[1] >= 12) {
									parts2[1] = parts2[1] - 12
								}
							}
							for (j = 0; j < i; j++) {
								if (validValues[j] !== undefined) {
									v1 = step(parts1[j], steps[w[j]], mins[w[j]], maxs[w[j]]);
									v2 = step(parts2[j], steps[w[j]], mins[w[j]], maxs[w[j]]);
									hours1 = 0;
									hours2 = 0;
									hours3 = 0;
									if (hampm && j == 1) {
										hours1 = parts1[0] ? 12 : 0;
										hours2 = parts2[0] ? 12 : 0;
										hours3 = validValues[0] ? 12 : 0
									}
									if (!prop1) {
										v1 = 0
									}
									if (!prop2) {
										v2 = maxs[w[j]]
									}
									if ((prop1 || prop2) && (v1 + hours1 < validValues[j] + hours3 && validValues[j] + hours3 < v2 + hours2)) {
										all = true
									}
									if (validValues[j] != v1) {
										prop1 = false
									}
									if (validValues[j] != v2) {
										prop2 = false
									}
								}
							}
							if (!valid) {
								for (j = i + 1; j < 4; j++) {
									if (parts1[j] > 0) {
										add = steps[v]
									}
									if (parts2[j] < maxs[w[j]]) {
										remove = steps[v]
									}
								}
							}
							if (!all) {
								v1 = step(parts1[i], steps[v], mins[v], maxs[v]) + add;
								v2 = step(parts2[i], steps[v], mins[v], maxs[v]) - remove;
								if (prop1) {
									i1 = getValidIndex(target, v1, maxs[v], 0)
								}
								if (prop2) {
									i2 = getValidIndex(target, v2, maxs[v], 1)
								}
							}
							if (prop1 || prop2 || all) {
								if (valid) {
									$('.dw-li', target).slice(i1, i2).addClass('dw-v')
								} else {
									$('.dw-li', target).slice(i1, i2).removeClass('dw-v')
								}
							}
						}
					})
				}
			}
			function getIndex(t, v) {
				return $('.dw-li', t).index($('.dw-li[data-val="' + v + '"]', t))
			}
			function getValidIndex(t, v, max, add) {
				if (v < 0) {
					return 0
				}
				if (v > max) {
					return $('.dw-li', t).length
				}
				return getIndex(t, v) + add
			}
			function getArray(d) {
				var i, ret = [];
				if (d === null || d === undefined) {
					return d
				}
				for (i in o) {
					ret[o[i]] = f[i](d)
				}
				return ret
			}
			function convertRanges(arr) {
				var i, v, start, ret = [];
				if (arr) {
					for (i = 0; i < arr.length; i++) {
						v = arr[i];
						if (v.start && v.start.getTime) {
							start = new Date(v.start);
							while (start <= v.end) {
								ret.push(new Date(start.getFullYear(), start.getMonth(), start.getDate()));
								start.setDate(start.getDate() + 1)
							}
						} else {
							ret.push(v)
						}
					}
					return ret
				}
				return arr
			}
			inst.setDate = function(d, fill, time, temp, change) {
				inst.temp = getArray(d);
				inst.setValue(inst.temp, fill, time, temp, change)
			};
			inst.getDate = function(temp) {
				return getDate(temp ? inst.temp : inst.values)
			};
			inst.convert = function(obj) {
				var x = obj;
				if (!$.isArray(obj)) {
					x = [];
					$.each(obj, function(i, o) {
						$.each(o, function(j, o) {
							if (i === 'daysOfWeek') {
								if (o.d) {
									o.d = 'w' + o.d
								} else {
									o = 'w' + o
								}
							}
							x.push(o)
						})
					})
				}
				return x
			};
			inst.format = hformat;
			inst.order = o;
			inst.buttons.now = {
				text: s.nowText,
				css: 'dwb-n',
				handler: function() {
					inst.setDate(new Date(), false, 0.3, true, true)
				}
			};
			if (s.showNow) {
				s.buttons.splice($.inArray('set', s.buttons) + 1, 0, 'now')
			}
			invalid = invalid ? inst.convert(invalid) : false;
			invalid = convertRanges(invalid);
			valid = convertRanges(valid);
			mind = getDate(getArray(mind));
			maxd = getDate(getArray(maxd));
			mins = {
				y: mind.getFullYear(),
				m: 0,
				d: 1,
				h: minH,
				i: minM,
				s: minS,
				a: 0
			};
			maxs = {
				y: maxd.getFullYear(),
				m: 11,
				d: 31,
				h: maxH,
				i: maxM,
				s: maxS,
				a: 1
			};
			return {
				wheels: wheels,
				headerText: s.headerText ?
				function() {
					return datetime.formatDate(hformat, getDate(inst.temp), s)
				} : false,
				formatResult: function(d) {
					return datetime.formatDate(format, getDate(d), s)
				},
				parseValue: function(val) {
					return getArray(val ? datetime.parseDate(format, val, s) : (s.defaultValue || new Date()))
				},
				validate: function(dw, i, time, dir) {
					var validated = getClosestValidDate(getDate(inst.temp), dir),
						temp = getArray(validated),
						y = get(temp, 'y'),
						m = get(temp, 'm'),
						minprop = true,
						maxprop = true;
					$.each(['y', 'm', 'd', 'a', 'h', 'i', 's'], function(x, i) {
						if (o[i] !== undefined) {
							var min = mins[i],
								max = maxs[i],
								maxdays = 31,
								val = get(temp, i),
								t = $('.dw-ul', dw).eq(o[i]);
							if (i == 'd') {
								maxdays = s.getMaxDayOfMonth(y, m);
								max = maxdays;
								if (regen) {
									$('.dw-li', t).each(function() {
										var that = $(this),
											d = that.data('val'),
											w = s.getDate(y, m, d).getDay(),
											str = dord.replace(/[my]/gi, '').replace(/dd/, (d < 10 ? '0' + d : d) + (s.daySuffix || '')).replace(/d/, d + (s.daySuffix || ''));
										$('.dw-i', that).html(str.match(/DD/) ? str.replace(/DD/, '<span class="dw-day">' + s.dayNames[w] + '</span>') : str.replace(/D/, '<span class="dw-day">' + s.dayNamesShort[w] + '</span>'))
									})
								}
							}
							if (minprop && mind) {
								min = f[i](mind)
							}
							if (maxprop && maxd) {
								max = f[i](maxd)
							}
							if (i != 'y') {
								var i1 = getIndex(t, min),
									i2 = getIndex(t, max);
								$('.dw-li', t).removeClass('dw-v').slice(i1, i2 + 1).addClass('dw-v');
								if (i == 'd') {
									$('.dw-li', t).removeClass('dw-h').slice(maxdays).addClass('dw-h')
								}
							}
							if (val < min) {
								val = min
							}
							if (val > max) {
								val = max
							}
							if (minprop) {
								minprop = val == min
							}
							if (maxprop) {
								maxprop = val == max
							}
							if (i == 'd') {
								var first = s.getDate(y, m, 1).getDay(),
									idx = {};
								validateDates(invalid, y, m, first, maxdays, idx, 1);
								validateDates(valid, y, m, first, maxdays, idx, 0);
								$.each(idx, function(i, v) {
									if (v) {
										$('.dw-li', t).eq(i).removeClass('dw-v')
									}
								})
							}
						}
					});
					if (hasTime) {
						$.each(['a', 'h', 'i', 's'], function(i, v) {
							var val = get(temp, v),
								d = get(temp, 'd'),
								t = $('.dw-ul', dw).eq(o[v]);
							if (o[v] !== undefined) {
								validateTimes(invalid, i, v, temp, y, m, d, t, 0);
								validateTimes(valid, i, v, temp, y, m, d, t, 1);
								validValues[i] = +inst.getValidCell(val, t, dir).val
							}
						})
					}
					inst.temp = temp
				}
			}
		};
	$.each(['date', 'time', 'datetime'], function(i, v) {
		ms.presets.scroller[v] = preset;
		ms.presetShort(v)
	})
})(jQuery);
(function($, undefined) {
	var defaults = {
		inputClass: 'unitTxt',
		invalid: [],
		rtl: false,
		showInput: true,
		group: false,
		groupLabel: 'Groups',
		checkIcon: 'checkmark'
	};
	$.mobiscroll.presetShort('select');
	$.mobiscroll.presets.scroller.select = function(inst) {
		var change, grIdx, gr, group, input, optIdx, option, prev, prevent, timer, w, orig = $.extend({}, inst.settings),
			s = $.extend(inst.settings, defaults, orig),
			layout = s.layout || (/top|bottom/.test(s.display) ? 'liquid' : ''),
			isLiquid = layout == 'liquid',
			elm = $(this),
			multiple = elm.prop('multiple'),
			id = this.id + '_dummy',
			lbl = $('label[for="' + this.id + '"]').attr('for', id),
			label = s.label !== undefined ? s.label : (lbl.length ? lbl.text() : elm.attr('name')),
			selectedClass = 'dw-msel mbsc-ic mbsc-ic-' + s.checkIcon,
			groupHdr = $('optgroup', elm).length && !s.group,
			invalid = [],
			origValues = [],
			main = {},
			roPre = s.readonly;

		function genValues(cont, keys, values) {
			$('option', cont).each(function() {
				values.push(this.text);
				keys.push(this.value);
				if (this.disabled) {
					invalid.push(this.value)
				}
			})
		}
		function genWheels() {
			var cont, wheel, wg = 0,
				values = [],
				keys = [],
				w = [
					[]
				];
			if (s.group) {
				$('optgroup', elm).each(function(i) {
					values.push(this.label);
					keys.push(i)
				});
				wheel = {
					values: values,
					keys: keys,
					label: s.groupLabel
				};
				if (isLiquid) {
					w[0][wg] = wheel
				} else {
					w[wg] = [wheel]
				}
				cont = group;
				wg++
			} else {
				cont = elm
			}
			values = [];
			keys = [];
			if (groupHdr) {
				$('optgroup', elm).each(function(i) {
					values.push(this.label);
					keys.push('__group' + i);
					invalid.push('__group' + i);
					genValues(this, keys, values)
				})
			} else {
				genValues(cont, keys, values)
			}
			wheel = {
				multiple: multiple,
				values: values,
				keys: keys,
				label: label
			};
			if (isLiquid) {
				w[0][wg] = wheel
			} else {
				w[wg] = [wheel]
			}
			return w
		}
		function getOption(v) {
			var def = $('option', elm).attr('value');
			option = multiple ? (v ? v[0] : def) : (v === undefined || v === null ? def : v);
			if (s.group) {
				group = elm.find('option[value="' + option + '"]').parent();
				gr = group.index()
			}
		}
		function setVal(v, fill, change) {
			var value = [];
			if (multiple) {
				var sel = [],
					i = 0;
				for (i in inst._selectedValues) {
					sel.push(main[i]);
					value.push(i)
				}
				input.val(sel.join(', '))
			} else {
				input.val(v);
				value = fill ? inst.temp[optIdx] : null
			}
			if (fill) {
				elm.val(value);
				if (change) {
					prevent = true;
					elm.change()
				}
			}
		}
		function onTap(li) {
			var val = li.attr('data-val'),
				selected = li.hasClass('dw-msel');
			if (multiple && li.closest('.dwwl').hasClass('dwwms')) {
				if (li.hasClass('dw-v')) {
					if (selected) {
						li.removeClass(selectedClass).removeAttr('aria-selected');
						delete inst._selectedValues[val]
					} else {
						li.addClass(selectedClass).attr('aria-selected', 'true');
						inst._selectedValues[val] = val
					}
					if (inst.live) {
						setVal(val, true, true)
					}
				}
				return false
			}
		}
		if (s.group && !$('optgroup', elm).length) {
			s.group = false
		}
		if (!s.invalid.length) {
			s.invalid = invalid
		}
		if (s.group) {
			grIdx = 0;
			optIdx = 1
		} else {
			grIdx = -1;
			optIdx = 0
		}
		$('option', elm).each(function() {
			main[this.value] = this.text
		});
		getOption(elm.val());
		$('#' + id).remove();
		input = $('<input type="text" id="' + id + '" class="' + s.inputClass + '" placeholder="' + (s.placeholder || '') + '" readonly />');
		if (s.showInput) {
			input.insertBefore(elm)
		}
		inst.attachShow(input);
		var v = elm.val() || [],
			i = 0;
		for (i; i < v.length; i++) {
			inst._selectedValues[v[i]] = v[i]
		}
		setVal(main[option]);
		elm.off('.dwsel').on('change.dwsel', function() {
			if (!prevent) {
				inst.setValue(multiple ? elm.val() || [] : [elm.val()], true)
			}
			prevent = false
		}).addClass('dw-hsel').attr('tabindex', -1).closest('.ui-field-contain').trigger('create');
		if (!inst._setValue) {
			inst._setValue = inst.setValue
		}
		inst.setValue = function(d, fill, time, temp, change) {
			var i, value, v = $.isArray(d) ? d[0] : d;
			option = v !== undefined && v !== null ? v : $('option', elm).attr('value');
			if (multiple) {
				inst._selectedValues = {};
				if (d) {
					for (i = 0; i < d.length; i++) {
						inst._selectedValues[d[i]] = d[i]
					}
				}
			}
			if (v === null) {
				value = null
			} else if (s.group) {
				group = elm.find('option[value="' + option + '"]').parent();
				gr = group.index();
				value = [gr, option]
			} else {
				value = [option]
			}
			inst._setValue(value, fill, time, temp, change);
			if (fill) {
				var changed = multiple ? true : option !== elm.val();
				setVal(main[option], changed, change === undefined ? fill : change)
			}
		};
		inst.getValue = function(temp, group) {
			var val = temp ? inst.temp : (inst._hasValue ? inst.values : null);
			return val ? (s.group && group ? val : val[optIdx]) : null
		};
		return {
			width: 50,
			wheels: w,
			layout: layout,
			headerText: false,
			anchor: input,
			formatResult: function(d) {
				return main[d[optIdx]]
			},
			parseValue: function(val) {
				var v = elm.val() || [],
					i = 0;
				if (multiple) {
					inst._selectedValues = {};
					for (i; i < v.length; i++) {
						inst._selectedValues[v[i]] = v[i]
					}
				}
				getOption(val === undefined ? elm.val() : val);
				return s.group ? [gr, option] : [option]
			},
			onBeforeShow: function() {
				if (multiple && s.counter) {
					s.headerText = function() {
						var length = 0;
						$.each(inst._selectedValues, function() {
							length++
						});
						return length + ' ' + s.selectedText
					}
				}
				getOption(elm.val());
				if (s.group) {
					prev = gr;
					inst.temp = [gr, option]
				}
				s.wheels = genWheels()
			},
			onMarkupReady: function(dw) {
				dw.addClass('dw-select');
				$('.dwwl' + grIdx, dw).on('mousedown touchstart', function() {
					clearTimeout(timer)
				});
				if (groupHdr) {
					$('.dw', dw).addClass('dw-select-gr');
					$('.dw-li[data-val^="__group"]', dw).addClass('dw-w-gr')
				}
				if (multiple) {
					dw.addClass('dwms');
					$('.dwwl', dw).on('keydown', function(e) {
						if (e.keyCode == 32) {
							e.preventDefault();
							e.stopPropagation();
							onTap($('.dw-sel', this))
						}
					}).eq(optIdx).addClass('dwwms').attr('aria-multiselectable', 'true');
					origValues = $.extend({}, inst._selectedValues)
				}
			},
			validate: function(dw, i, time) {
				var j, v, t = $('.dw-ul', dw).eq(optIdx);
				if (i === undefined && multiple) {
					v = inst._selectedValues;
					j = 0;
					$('.dwwl' + optIdx + ' .dw-li', dw).removeClass(selectedClass).removeAttr('aria-selected');
					for (j in v) {
						$('.dwwl' + optIdx + ' .dw-li[data-val="' + v[j] + '"]', dw).addClass(selectedClass).attr('aria-selected', 'true')
					}
				}
				if (s.group && (i === undefined || i === grIdx)) {
					gr = +inst.temp[grIdx];
					if (gr !== prev) {
						group = elm.find('optgroup').eq(gr);
						option = group.find('option').not('[disabled]').eq(0).val();
						option = option || elm.val();
						s.wheels = genWheels();
						if (!change) {
							inst.temp = [gr, option];
							s.readonly = [false, true];
							clearTimeout(timer);
							timer = setTimeout(function() {
								change = true;
								prev = gr;
								inst.changeWheel([optIdx], undefined, true);
								s.readonly = roPre
							}, time * 1000);
							return false
						}
					} else {
						s.readonly = roPre
					}
				} else {
					option = inst.temp[optIdx]
				}
				$.each(s.invalid, function(i, v) {
					$('.dw-li[data-val="' + v + '"]', t).removeClass('dw-v')
				});
				change = false
			},
			onClear: function(dw) {
				inst._selectedValues = {};
				input.val('');
				$('.dwwl' + optIdx + ' .dw-li', dw).removeClass(selectedClass).removeAttr('aria-selected')
			},
			onValueTap: onTap,
			onSelect: function(v) {
				setVal(v, true, true)
			},
			onCancel: function() {
				if (!inst.live && multiple) {
					inst._selectedValues = $.extend({}, origValues)
				}
			},
			onChange: function(v) {
				if (inst.live && !multiple) {
					input.val(v);
					prevent = true;
					elm.val(inst.temp[optIdx]).change()
				}
			},
			onDestroy: function() {
				input.remove();
				elm.removeClass('dw-hsel').removeAttr('tabindex')
			}
		}
	}
})(jQuery);